export function createStore(reducer, fn) {

  // {getState,subscribe,dispatch}
  let state;
  let callbacks = [];
  function getState() {
    // 用来获取状态的
    return state
  }
  function subscribe(f) {
    // 可以接收一些回调函数  当数据更新完成之后触发
    callbacks.push(f)
    return function () {
      // 这个小函数一旦执行 那么就会把subscribe添加进来的f
      // 给移除掉
      callbacks = callbacks.filter(v => v != f)
    }
  }
  function dispatch(action) {
    // debugger
    // 触发reducer执行 从而更新state
    state = reducer(state, action)
    // 数据更新之后 触发callbacks中的各个回调函数
    callbacks.forEach(f => f())

  }
  //源码执行一次dispatch 是为了给state赋予初始值
  dispatch({ type: '@@typesdfgsgsdfgsdg' })
  // debugger
  if (typeof fn == 'function') {
    let new_createStore = fn(createStore)
    return new_createStore(reducer)
  }
  return { getState, subscribe, dispatch }
}

export function combineReducers(obj) {
  // obj:{countState: CountReducer,colorState: colorReducer}
  return function rootReducer(rootState, action) {
    // debugger
    // rootState:{countState:{count:100},colorState:{color:'red'}}
    rootState = rootState || {};
    Object.keys(obj).forEach(key => {
      rootState[key] = obj[key](rootState[key], action)
    })
    return {
      ...rootState
    }
  }
}

export function compose(...fs) {
  let first = fs.shift()
  return function (...args) {
    return fs.reduce((prev, cur) => {
      return cur(prev)
    }, first(...args))
  }
}

export function applyMiddleware(...midwares) {
  // debugger
  // midware  -->  thunk
  console.log(midwares)
  return function fn(createStore) {
    return function new_createStore(reducer) {
      // createStore在使用的时候 返回的内容其实是new_createStore的执行结果
      let store = createStore(reducer)
      console.log(store)
      let temps = midwares.map(item => item(store))
      let lastTemp = compose(...temps)
      let new_dispatch = lastTemp(store.dispatch)
      // temp函数的作用就是 根据原有dispatch 返回一个整合之后的dispatch
      //  合之后的lastTemp 接收dispatch作为参数 返回第一个中间件产生的dispatch
      //  给第二个中间件的temp，第二个中间的temp在去根据上个中间返回的新的dsipatch
      //  再去产生一个更加新的dispatch
      return {
        ...store,
        dispatch: new_dispatch
      }
    }
  }
}

// export function applyMiddleware(midware) {
//   // debugger
//   // midware  -->  thunk
//   console.log(midware)
//   return function fn(createStore) {
//     return function new_createStore(reducer) {
//       // createStore在使用的时候 返回的内容其实是new_createStore的执行结果
//       let store = createStore(reducer)
//       console.log(store)
//       let temp = midware(store)
//       let new_dispatch = temp(store.dispatch)
//       return {
//         ...store,
//         dispatch: new_dispatch
//       }
//     }
//   }
// }

